﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QldtSdh.GUI.DaoTao
{
    using BLL;
    using DAL;
    using DAL.Models;
    using GUI.Utils;
    using QldtSdh.GUI.Common;
    using QldtSdh.Utils;

    /// <summary>
    /// Tạo lớp học phần cho các lớp khoá ngành thuộc cơ sở đào tạo cho trước trong 1 học kỳ cho trước
    /// </summary>
    public partial class FormTaoLopHocPhanTrongKHDT : QldtSdh.GUI.Common.BaseDialog
    {
        private bool _DoNotLoadDanhSachHocPhanDuKien = false;
        private bool _DoNotLoadDanhSachLopKhoaNganh = false;

        private HocKy _HocKy;

        private CoSoDaoTao SelectedCoSoDaoTao
        {
            get
            {
                CoSoDaoTao coso = null;
                if (bsCoSoDaoTao.Current != null)
                    coso = bsCoSoDaoTao.Current as CoSoDaoTao;
                return coso;
            }
        }

        private LopKhoaNganh SelectedLopKhoaNganh
        {
            get
            {
                LopKhoaNganh lop = null;
                if (bsLopKhoaNganh.Current != null)
                    lop = bsLopKhoaNganh.Current as LopKhoaNganh;
                return lop;
            }
        }

        public FormTaoLopHocPhanTrongKHDT(HocKy hocKy)
        {
            InitializeComponent();

            lblHeader.Text = string.Format("Tạo Lớp học phần trong Kế hoạch đào tạo của Học kỳ {0}", hocKy.TenHocKyDayDu);

            gridLopKhoaNganh.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: false);
            gridLopKhoaNganh.AddRowIndexing();
            gridHocPhanTrongKHDT.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: true);
            gridHocPhanTrongKHDT.AddRowIndexing();

            this._HocKy = hocKy;
            _DoNotLoadDanhSachLopKhoaNganh = true;
            try
            {
                using (var db = CEMS4UG_DHKHContext.GetContext())
                {
                    // 2. Nạp danh sách các Cơ sở đào tạo
                    bsCoSoDaoTao.DataSource = BizCoSoDaoTao.GetListCoSoDaoTao(db);
                    cbxCoSoDaoTao.DisplayMember = "TenCoSoDaoTao";
                    cbxCoSoDaoTao.DataSource = bsCoSoDaoTao;

                    NapDanhSachLopKhoaNganh();
                }
            }
            finally
            {
                _DoNotLoadDanhSachLopKhoaNganh = false;
            }
        }

        private void NapDanhSachLopKhoaNganh()
        {
            bsLopKhoaNganh.DataSource = BizDaoTao.GetListLopKhoaNganh(this._HocKy, this.SelectedCoSoDaoTao);
            gridLopKhoaNganh.SetDataSource(bsLopKhoaNganh);
            if (_DoNotLoadDanhSachHocPhanDuKien)
                UpdateGuiBySelectedLopKhoaNganh();
        }

        private void UpdateGuiBySelectedLopKhoaNganh()
        {
            var lopKhoaNganh = this.SelectedLopKhoaNganh;
            if (lopKhoaNganh == null)
            {
                bsHocPhanTrongKHDT.DataSource = null;
                lblDanhSachHocPhanDuKien_Title.Text = "";
            }
            else
            {
                bsHocPhanTrongKHDT.DataSource = BizDaoTao.GetListTinhTrangMoLopHocPhanTrongKHDT(lopKhoaNganh, _HocKy);
                lblDanhSachHocPhanDuKien_Title.Text = string.Format("Kế hoạch đào tạo cho lớp khoá-ngành {0}", lopKhoaNganh.TenLopKhoaNganh);
            }

            gridHocPhanTrongKHDT.SetDataSource(bsHocPhanTrongKHDT);
        }

        private void btnTaoLopHocPhan_Click(object sender, EventArgs e)
        {
            CoSoDaoTao coSoDaoTao = this.SelectedCoSoDaoTao;
            if (coSoDaoTao == null)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn cơ sở đào tạo trước khi thực hiện thao tác này!");
                return;
            }

            LopKhoaNganh lopKhoaNganh = null;
            if (chkChiTaoLopHocPhanChoLopKhoaNganhDangChon.Checked)
            {
                lopKhoaNganh = SelectedLopKhoaNganh;
                if (lopKhoaNganh == null)
                {
                    DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn một lớp khoá-ngành trước khi thực hiện thao tác này!");
                    return;
                }
            }
            var lst = BizDaoTao.GetListHocPhanTrongKHDTChuaDuocMoLopHocPhan(lopKhoaNganh, coSoDaoTao, _HocKy);
            if (lst.Count == 0)
            {
                DialogUtils.ShowMessage("Tất cả các học phần đều được mở lớp!");
                return;
            }

            if (!DialogUtils.Confirmed("Chương trình chuẩn bị tạo {0} lớp học phần.\nBạn muốn tiếp tục không?", lst.Count))
                return;

            picProgress.Visible = true;

            try
            {
                var n = BizDaoTao.TaoLopHocPhan(lst, _HocKy, coSoDaoTao);
                DialogUtils.ShowMessage(string.Format("Đã tạo {0} lớp học phần trong học kỳ {1} tại cơ sở đào tạo {2}",
                    n, _HocKy.TenHocKyDayDu, coSoDaoTao.TenCoSoDaoTao));
                UpdateGuiBySelectedLopKhoaNganh();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Xuất hiện lỗi trong quá trình tạo lớp học phần\n.Chi tiết lỗi: {0}", exc.ToString());
            }

            picProgress.Visible = false;
        }

        private void bsCoSoDaoTao_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDanhSachLopKhoaNganh)
                return;
            NapDanhSachLopKhoaNganh();
        }

        private void bsLopKhoaNganh_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDanhSachHocPhanDuKien)
                return;
            UpdateGuiBySelectedLopKhoaNganh();
        }

        private void FormTaoLopHocPhanTrongKHDT_FormClosing(object sender, FormClosingEventArgs e)
        {

        }
    }
}
